[毎日Kotlin] Day14. Introduction
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
Introductionの振り返り
Day1~13でIntroductionの章が終わりました。よく使う機能がまとめられていたと思います。もう一度、問題を解き直すのもありだと思います。
Kotlinのメソッドの文法を学びました。省略してますがよく使う書き方です。
fun [メソッド名]: [返り値型] { return [返り値] }
Kotlinにはさまざまな省略形がありますので、忘れた方は見返してみよう。
[毎日Kotlin] Day2. Java to Kotlin conversion(JavaをKotlinに変換)
JavaからKotlinに自動変換する機能がIntelliJ IDEA、Android Studio、Try Kotlinにあります。Javaではかけるけど、Kotlinでどう書くのか簡易的に調べることができます。Kotlinでベストかどうかはまた別ですが、検索キーワードがわかるので便利です。
[毎日Kotlin] Day3. Named arguments(名前付き引数)
[毎日Kotlin] Day4. Default arguments(デフォルト引数)
名前付き引数、デフォルト引数がKotlinでは使えます。
//number, toUpperCaseのデフォルト値を設定している fun foo(name: String, number: Int = 42, toUpperCase: Boolean = false) = (if (toUpperCase) name.toUpperCase() else name) + number fun useFoo() = listOf( foo("a"), foo("b", number = 1), foo("c", toUpperCase = true), //名前付き引数でtoUpperCaseで値を入れている foo(name = "d", number = 2, toUpperCase = true) )
Kotlinでよく使われる機能であり、慣れている人には読みやすく、初見では読みにくいので、必ず使いこなせるようにしましょう。ソースコードを読む上でも重要です。様々な省略形がありますので、要注意です。
無名クラスを簡単にかける文法っと雑に覚えておくといいかもしれません。(まさかり怖い)
fun containsEven(collection: Collection<Int>): Boolean = collection.any { it % 2 == 0 } //何か一つでもpredicateの条件と一致しているものがあったら、return true をするもの public inline fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean { if (this is Collection && isEmpty()) return false for (element in this) if (predicate(element)) return true return false }
[毎日Kotlin] Day6.Strings(テンプレート)
テンプレート機能があるので、文字列の結合や正規表現などを使うときに、かなり便利です。
val name = "kamedon" print("Hello $name! ")
[毎日Kotlin] Day7. Data classes(データクラス)
データクラスはValue Objectを作るケースではすごく便利です。equals、hashCode、toStringがオーバーロードされ、copy、componentNが作られます。便利すぎて、「とりあえずData classにすればいいのでしょう?」となりがちですが、Javaのときの等価コードをイメージできないと罠にハマるかもしれません。要チェックです。
data class Person(val name: String, val age: Int)
[毎日Kotlin] Day8. Nullable types(Null許容型)
Nullを扱いやすくする機能がKotlinにはたくさんあります。とても重要な機能で、コンパイルレベルで安全なコードにできます。Not Nullで扱うテクニックはたくさんあり、それがKotlinっぽいコードになったりします。
fun sendMessageToClient( client: Client?, message: String?, mailer: Mailer ) { //messageがnullの時、早期return message ?: return val email = client?.personalInfo?.email ?: return mailer.sendMessage(email, message) }
[毎日Kotlin] Day9.Smart casts(スマートキャスト)
型チェックしたらキャストも空気を読んでやってくれます。Not Nullも文脈からわかるときには空気を読んでNot Nullにしてくれます。
fun eval(expr: Expr): Int = when (expr) { is Num -> expr.value is Sum -> eval(expr.left) + eval(expr.right) else -> throw IllegalArgumentException("Unknown expression") } interface Expr class Num(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr
fun foo(str: String?) { if (str != null) { //?がいらない。not nullであることが推論され、スマートキャストされます str.length } str ?:return //?がいらない。not nullであることが推論され、スマートキャストされます str.length }
[毎日Kotlin] Day10. Extension functions(拡張関数)
ラムダ式より、もしかしたら使用頻度が多いかもしれませんね。Javaでどう表現されるのか、レシーバーが何を指しているかわからないときは、もう一度見返してみよう。
fun Int.r(): RationalNumber = RationalNumber(this, 1) fun Pair<Int, Int>.r(): RationalNumber = RationalNumber(first, second) data class RationalNumber(val numerator: Int, val denominator: Int)
[毎日Kotlin] Day11. Object expressions(オブジェクト式)
[毎日Kotlin] Day12. SAM conversions(SAM変換)
[毎日Kotlin] Day13. Extension functions on collections(コレクションの拡張関数)
Day11~13は、同じ問題を3つの方法で解いています。リストをソートする問題です。
// Kotlinのスタンダードライブラリの便利拡張 fun getList(): List<Int> { return arrayListOf(1, 5, 2).sortedDescending() }
import java.util.* // object式を使って無名クラスを作る fun getList(): List<Int> { val arrayList = arrayListOf(1, 5, 2) Collections.sort(arrayList, object : Comparator<Int> { override fun compare(x: Int, y: Int) = y - x }) return arrayList }
// SAM conversions(SAM変換) // 引数がJavaインターフェイスで、オーバーライドするメソッドも1つだった時、ラムダ式でかける fun getList(): List<Int> { val arrayList = arrayListOf(1, 5, 2) Collections.sort(arrayList, { x, y -> y - x }) return arrayList }
あとがき
Day15.でまたお会いしましょう。